//
// Created by ASUS on 2024/3/9.
//
/*
 给你一个整数数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1：
输入：nums = [1,3,-1,-3,5,3,6,7], k = 3
输出：[3,3,5,5,6,7]
解释：
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7
示例 2：
输入：nums = [1], k = 1
输出：[1]
提示：
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
 */

#include <bits/stdc++.h>
using namespace std;

vector<int> maxSlidingWindow(vector<int> nums={1,3,-1,-3,5,3,6,7}, int k=3) {
	vector<int> ans;
	deque<int> q; // 双端队列
	for (int i = 0; i < nums.size(); i++) {
		// 1. 入
		while (!q.empty() && nums[q.back()] <= nums[i]) {
			q.pop_back(); // 维护 q 的单调性
		}
		q.push_back(i); // 入队
		// 2. 出
		if (i - q.front() >= k) { // 队首已经离开窗口了
			q.pop_front();
		}
		// 3. 记录答案
		if (i >= k - 1) {
			// 由于队首到队尾单调递减，所以窗口最大值就是队首
			ans.push_back(nums[q.front()]);
		}
	}
	return ans;
}

int main(){
	maxSlidingWindow();
	return 0;
}
